package clientegestionred;

/** Clase para realizar consultas tipo GET y GETNEXT **/

import java.io.IOException;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.event.*;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;

public class Consulta {

    private String address; //direccion del agente SNMP
    private Snmp snmp; //objeto para la comunicacion SNMP
    private String type; //tipo de consulta
    private OID ultimoOID; //ultimo OID recibido al hacer GETNEXT

    /* Constructor para un unico OID */
    Consulta(Snmp snmp, String address){
        this.snmp = snmp;
        this.address = address;
    }

    /* Constructor para varios OIDs */
    Consulta(Snmp snmp, OID []oids, String address){
        this.snmp = snmp;
        this.address = address;
    }

    /* Metodo para obtener el valor de un unico parametro */
    public String getSimple(OID oid) throws IOException {
        type = "get";
        ResponseEvent event = getEvent(new OID[]{oid});
        String s = event.getResponse().get(0).getVariable().toString();
        return s;
    }

    /* Metodo para obtener el valor de varios parametros */
    public String [] getMultiple(OID oids[]) throws IOException {
        type = "get";
        ResponseEvent event = getEvent(oids);
        String []respuestas = new String[oids.length];
        for (int i = 0; i<oids.length; i++) {
            respuestas[i] = event.getResponse().get(i).getVariable().toString();
        }
        return respuestas;
    }

    /* Metodo para realizar una consulta tipo GETNEXT */
    public String getNext(OID oid) throws IOException{
        type = "getnext";
        ResponseEvent event = getEvent(new OID[]{oid});
        ultimoOID = event.getResponse().get(0).getOid();
        return event.getResponse().get(0).getVariable().toString();//devolver solo el primero
    }

    /* Enviar la peticion */
    public ResponseEvent getEvent(OID oids[]) throws IOException {

        // Crear el PDU con los OIDs
        PDU pdu = new PDU();
        for (OID oid_index : oids) {
             pdu.add(new VariableBinding(oid_index));
        }
        if (type.equalsIgnoreCase("get"))
            pdu.setType(PDU.GET);
        else pdu.setType(PDU.GETNEXT);

        // Enviar la consulta
        ResponseEvent event = snmp.send(pdu, getTarget(), null);
        if(event != null) {
             return event;
        }
        throw new RuntimeException("Query timed out");
    }

    /* Establecer los valores del host remoto, comunidad, version, etc */
    private Target getTarget() {
        Address targetAddress = GenericAddress.parse(address); //direccion remota
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public")); //comunidad
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c); //version snmp
        return target;
    }

    /* Ultimo OID por el que se ha consultado */
    public OID getUltimoOID(){
        return ultimoOID;
    }

}//class